package com.cuiweiyou.gimmick;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

public class WordManager {
    /**
     * 贷款话术语句
     */
    private List<String> gimmickMsgList;
    /**
     * 没有匹配到对方话术时的随意回复
     */
    private List<String> emptyAnswerMsgList;
    /**
     * 匹配到回复话术时的随意的前缀词汇
     */
    private List<String> prefixAnswerMsgList;
    /**
     * 分词，话术中有意义的固定的词汇
     */
    private List<String> fixedWordList;
    /**
     * 分词，话术中无关紧要的词汇
     */
    private List<String> normalOtherWordList;
    /**
     * 近义词
     */
    private Map<String, List<String>> homoionymWordMap;

    /**
     * 近义词
     */
    private List<String> helloWordList;

    private static WordManager instance;

    private WordManager() {
        initEmptyMsgs();
        initGimmickMsgs();
        initHomoionymWord();
        initFixedOtherWord();
        initNormalOtherWord();
        initPrefixAnswerMsgs();
        initHelloHomoionymWord();
    }

    public static WordManager getInstance() {
        if (null == instance) {
            synchronized (WordManager.class) {
                if (null == instance) {
                    instance = new WordManager();
                }
            }
        }
        return instance;
    }

    private void initGimmickMsgs() {
        String gimmick1 = "您好！请问有什么可以帮助到您？回复下方关键词，为您详细解答：" +
                "\n" + "回复“1”，我要菜" +
                "\n" + "回复“2”，买菜申请指南" +
                "\n" + "回复“3”，我能拿多少斤菜？" +
                "\n" + "如有其他问题，请留言，等待客服回复，如未及时回复请耐心等待";
        String gimmick2 = "Hi～/:rose" +
                "\n" + "送您个见面礼，不用谢" +
                "\n" + "麦小鲜，海螺，大放水" +
                "\n" + "回复“1”获取优惠";
        String gimmick3 = "/:rose Hi～欢迎老板～光临小店" +
                "\n" + "本小店长期发放各种财富福利" +
                "\n" + "让我带你一起飞" +
                "\n" + "回复“指条明路”";

        gimmickMsgList = new ArrayList<>();
        gimmickMsgList.add(gimmick1);
        gimmickMsgList.add(gimmick2);
        gimmickMsgList.add(gimmick3);
    }

    private void initEmptyMsgs() {
        emptyAnswerMsgList = new ArrayList<>();
        emptyAnswerMsgList.add("我在上班...等老板走了聊哈");
        emptyAnswerMsgList.add("嗯呐");
        emptyAnswerMsgList.add("/:,@-D");
        emptyAnswerMsgList.add("/::D");
        emptyAnswerMsgList.add("嘿嘿");
    }

    private void initPrefixAnswerMsgs() {
        prefixAnswerMsgList = new ArrayList<>();
        prefixAnswerMsgList.add("OK，");
        prefixAnswerMsgList.add("嗯，");
        prefixAnswerMsgList.add("好，");
        prefixAnswerMsgList.add("嗯呢 ");
        prefixAnswerMsgList.add("/::D");
        prefixAnswerMsgList.add("/:,@-D");
        prefixAnswerMsgList.add("");
    }

    private void initHomoionymWord() { // 近义词
        /*
         * 比如
         * 客户问：想贷3000，怎么整啊？
         * 话术中可以匹配的句子是：怎么贷3000 ？
         * 从近义词里找到"怎么"取出其一组的 怎么、怎么办、怎么弄、怎么贷等等，
         * 就可以认为客户的问句里有"怎么贷"这个词，而匹配上了。
         * 最终就可以理解为客户问的是"怎么贷3000块？"
         * -------
         * 是否需要这些近义词还要看话术设计
         * */

        // 疑问词
        List<String> todoList = new ArrayList<>();
        todoList.add("能办理");
        todoList.add("能借到");
        todoList.add("可以办理");
        todoList.add("可以借到");

        // 疑问词
        List<String> howcan = new ArrayList<>();
        howcan.add("怎么");
        howcan.add("怎么办");
        howcan.add("怎么弄");
        howcan.add("怎么整");
        howcan.add("如何");
        howcan.add("如何操作");
        howcan.add("如何处理");

        // 主观词
        List<String> iwant = new ArrayList<>();
        iwant.add("我想");
        iwant.add("我打算");
        iwant.add("我的想法");

        List<String> okflag = new ArrayList<>();
        okflag.add("怎么审核");
        okflag.add("什么标准审核");

        List<String> borrowcount = new ArrayList<>();
        borrowcount.add("能贷多少");
        borrowcount.add("能借多少");
        borrowcount.add("额度多少");
        borrowcount.add("额度是多少");

        List<List<String>> all = new ArrayList<>();
        all.add(todoList);
        all.add(howcan);
        all.add(iwant);
        all.add(okflag);
        all.add(borrowcount);

        homoionymWordMap = new HashMap<>();
        for (int i = 0; i < all.size(); i++) {
            List<String> words = all.get(i);
            for (int j = 0; j < words.size(); j++) {
                String word = words.get(j);
                homoionymWordMap.put(word, words);
            }
        }
    }

    private void initHelloHomoionymWord() { // 加好友后对方的问话，如下句子都视为初次问好
        helloWordList = new ArrayList<>();
        helloWordList.add("对方请求添加你为朋友");
        helloWordList.add("通过了你的朋友验证请求");
        helloWordList.add("现在我们可以开始");
        helloWordList.add("你已添加了");
        helloWordList.add("现在可以开始");
    }

    private void initFixedOtherWord() { // 如果出现在对方的话里，作为固定短语保留
        fixedWordList = new ArrayList<>();
        fixedWordList.add("什么时候");
        fixedWordList.add("什么标准");
        fixedWordList.add("是什么");
        fixedWordList.add("为什么");
        fixedWordList.add("我的菜");
        fixedWordList.add("能借到");

        fixedWordList.add("怎么审核");
        fixedWordList.add("什么审核标准");
        fixedWordList.add("怎么通过审核");

        fixedWordList.add("额度多少");
        fixedWordList.add("能买多少");
        fixedWordList.add("能要多少");
        fixedWordList.add("可以买多少");
    }

    private void initNormalOtherWord() { // 这些词从对方的话中过滤掉，去掉
        normalOtherWordList = new ArrayList<>(); //
        normalOtherWordList.add("了");
        normalOtherWordList.add("吧");
        normalOtherWordList.add("的");
        normalOtherWordList.add("嗯");
        normalOtherWordList.add("哈");
        normalOtherWordList.add("哎");
        normalOtherWordList.add("呜");
        normalOtherWordList.add("吗");
        normalOtherWordList.add("你");
        normalOtherWordList.add("我想");
        normalOtherWordList.add("我");
        normalOtherWordList.add("问一下");
        normalOtherWordList.add("问下");
        normalOtherWordList.add("他说");
        normalOtherWordList.add("他");
        normalOtherWordList.add("她");
        normalOtherWordList.add("在上班");
        normalOtherWordList.add("在睡觉");
        normalOtherWordList.add("在干啥");
        normalOtherWordList.add("好吧");
        normalOtherWordList.add("好的");
        normalOtherWordList.add("好");
        normalOtherWordList.add("行吧");
        normalOtherWordList.add("有事吗");
        normalOtherWordList.add("你是谁");
        normalOtherWordList.add("哪位");
        normalOtherWordList.add("你好");
        normalOtherWordList.add("你好啊");
        normalOtherWordList.add("您好");
        normalOtherWordList.add("找谁");
        normalOtherWordList.add("嗯？");
        normalOtherWordList.add("什么人");
        normalOtherWordList.add("你谁呀");
    }

    /**
     * 是否是打招呼语句<br/>
     * 如果是，则调用 {@link #getRandomGimmickMsg} 进行回复
     *
     * @param word
     * @return
     */
    public boolean isHelloWord(String word) {
        boolean contains = helloWordList.contains(word);
        if (!contains) {
            for (int i = 0; i < helloWordList.size(); i++) {
                String str = helloWordList.get(i);
                if (word.contains(str)) {
                    contains = true;
                    break;
                }
            }
        }
        System.out.println("是否为打招呼：" + contains);
        return contains;
    }

    /**
     * 打招呼的固定回复，推广内容
     *
     * @return
     */
    public String getRandomGimmickMsg() {
        int size = gimmickMsgList.size();
        int index = new Random().nextInt(size - 1);
        String answer = gimmickMsgList.get(index);
        System.out.println("随机回复：" + answer);
        return answer;
    }

    /**
     * 检查意义特殊的固定词汇
     *
     * @param string
     * @return
     */
    public List<String> getFixedWord(String string) {
        if (null == string || string.length() < 1) {
            return null;
        }

        List<String> result = new ArrayList<>();
        for (int i = 0; i < fixedWordList.size(); i++) {
            String word = fixedWordList.get(i);
            if (string.contains(word)) {
                if (!result.contains(word)) {
                    result.add(word);
                }
            }
        }
        System.out.println(string + "\n固定词：" + result);
        return result;
    }

    /**
     * 取近义词
     *
     * @param word 分词后得出的词语
     * @return 近义词集合，可能为null
     */
    public List<String> getHomoionymWord(String word) {
        List<String> strings = homoionymWordMap.get(word);
        if (null == strings) {
            return new ArrayList<String>();
        }
        System.out.println(word + "，近义词：" + strings.toString());
        return strings;
    }

    /**
     * 没有匹配到对方话术时的随意回复
     *
     * @return
     */
    public String getRandomEmptyAnswerMsg() {
        int size = emptyAnswerMsgList.size();
        int index = new Random().nextInt(size - 1);
        return emptyAnswerMsgList.get(index);
    }

    /**
     * 回复话术时的随意的前缀词汇
     *
     * @return
     */
    public String getPrefixAnswerMsg() {
        int size = prefixAnswerMsgList.size();
        int index = new Random().nextInt(size - 1);
        return prefixAnswerMsgList.get(index);
    }

    /**
     * 去除对方语句中无意义词汇
     *
     * @param string
     * @return
     */
    public String delNormalOtherWord(String string) {
        System.out.println("原始句子：" + string);
        String result = string;
        for (int i = 0; i < normalOtherWordList.size(); i++) {
            String word = normalOtherWordList.get(i);
            result = result.replace(word, "");
        }
        System.out.println("过滤词后句子：" + result);
        return result;
    }
}
